#pragma once
#include<assert.h>
//防止与std库里的stack冲突
namespace MyStack {
	//底层容器可以是vector,list,deque，deque兼容了vector和list所有的接口
	//因为只学习了vector和list，就以vector作为底层容器，即为顺序栈
	//如果以list作为底层容器，即为链栈
	//template<class T, class Container = list<T>>
	template<class T, class Container = vector<T>>
	class stack
	{
	public:
		stack(){}

		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			assert(!empty());
			_con.pop_back();
		}
		const T& top() const
		{
			return _con.back();
		}
		bool empty() const
		{
			return _con.empty();
		}
		size_t size() const
		{
			return _con.size();
		}
		void swap(stack& st)
		{
			_con.swap(st._con);
		}
	private:
		Container _con;
	};
}
//namespace MyStack {
//	template<class T, class Container = deque<T>>
//	class stack
//	{
//	public:
//		void push(const T& val)
//		{
//			_con.push_back(val);
//		}
//		void pop()
//		{
//			assert(!empty());
//			_con.pop_back();
//		}
//		const T& top() const
//		{
//			return _con.back();
//		}
//		bool empty() const
//		{
//			return _con.empty();
//		}
//		size_t size() const
//		{
//			return _con.size();
//		}
//	private:
//		Container _con;
//	};
//}